package com.arges.dao;

import com.arges.util.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;

import java.io.Serializable;
import java.util.List;

/**
 * Dao 持久层公共类
 */
public class BaseDao {
    /**
     * 添加
     * @param obj
     * @return
     */
    public <T> Serializable save(T obj){
        // 获取 session
        Session session = HibernateUtils.getSession();
        // 添加 开启事务回滚
        Transaction t = session.beginTransaction();
        // 执行添加操作(返回主键)
        Serializable ser = session.save(obj);
        // 提交事务
        t.commit();
        // 释放资源
        session.close();
        HibernateUtils.sessionFactory.close();
        return ser;
    }
    /**
     * hibernate 修改
     * @return
     */
    public void update(Object obj){
        // 获取 session
        Session session = HibernateUtils.getSession();
        // 添加 开启事务回滚
        Transaction t = session.beginTransaction();
        // 执行修改操作
        session.update(obj);
        // 提交事务
        t.commit();
        // 释放资源
        session.close();
        HibernateUtils.sessionFactory.close();
    }
    /**
     * hibernate 删除
     * @return
     */
    public void delete(Object obj){
        // 获取 session
        Session session = HibernateUtils.getSession();
        // 添加 开启事务回滚
        Transaction t = session.beginTransaction();
        // 执行删除操作
        session.delete(obj);
        // 提交事务
        t.commit();
        // 释放资源
        session.close();
        HibernateUtils.sessionFactory.close();
    }

    /**
     * hibernate 根据id查询
     * @return
     */
    public <T> T selectById(Class<T> clazz,Serializable id){
        // 获取 session
        Session session = HibernateUtils.getSession();

        // 执行根据id查询操作
        T t = session.get(clazz, id);

        // 释放资源
        session.close();
        HibernateUtils.sessionFactory.close();
        return t;
    }

    /**
     * hibernate 查询所有
     * @return
     */
    public List findAll(String hql){
        // 获取 session
        Session session = HibernateUtils.getSession();
        // hql查询 写的是实体类
        Query query = session.createQuery( hql);

        // 执行查询所有操作
        List list = query.list();
        // 释放资源
        session.close();
        HibernateUtils.sessionFactory.close();
        // 返回数据
        return list;
    }

}
